import requests
from src.Init import send_address


def send_group_msg(group_id: int, msg: str):
    """
    发送群聊消息
    :param group_id: 群号
    :param msg: 消息
    :return:
    """
    return requests.post(send_address + "/send_group_msg", data={
        "group_id": group_id,
        "message": msg
    }).json()


def send_private_msg(user_id: int, msg: str):
    """
    发送私聊消息
    :param user_id: 用户qq号
    :param msg: 消息
    :return:
    """
    return requests.post(send_address + "/send_private_msg", data={
        "user_id": user_id,
        "message": msg
    }).json()


async def get_msg(msg_id: int) -> dict:
    """
    获取消息
    注意：已测试已撤回的消息获取不到
    :param msg_id: 消息id
    :return:
    """
    return requests.post(send_address + "/get_msg", data={"message_id": msg_id}).json()


def delete_msg(msg_id: int) -> dict:
    """
    撤回消息
    :param msg_id: 消息id
    :return:
    """
    return requests.post(send_address + "/delete_msg", data={"message_id": msg_id}).json()


async def get_login_info() -> dict:
    """
    该接口用于获取 QQ 用户的登录号信息。
    :return:
    """
    return requests.get(send_address + "/get_login_info").json()


def get_stranger_info(user_id: int) -> dict:
    """
    该接口用于获取陌生人的信息。
    :param user_id: QQ号
    :return:
    """
    return requests.post(send_address + "/get_stranger_info", data={"user_id": user_id}).json()


def get_friend_list() -> dict:
    """
    该接口用于获取好友列表。
    :return:
    """
    return requests.get(send_address + "/get_friend_list").json()


def get_group_info(group_id: int) -> dict:
    """
    该接口用于获取群信息。
    :param group_id: 群号
    :return:
    """
    return requests.post(send_address + "/get_group_info", data={"group_id": group_id}).json()


async def get_group_list() -> dict:
    """
    该接口用于获取群列表
    响应时间较长
    :return:
    """
    return requests.get(send_address + "/get_group_list").json()


def get_group_member_info(group_id: int, user_id: int) -> dict:
    """
    该接口用于获取群成员信息。
    :param group_id:群号
    :param user_id:群成员qq号
    :return:
    """
    return requests.post(send_address + "/get_group_member_info",
                         data={"group_id": group_id, "user_id": user_id}).json()


async def get_group_member_list(group_id: int) -> dict:
    """
    该接口用于获取群成员列表。
    群成员越多等待时间越长
    :return:
    """
    return requests.post(send_address + "/get_group_member_list", data={"group_id": group_id}).json()


def get_group_honor_info(group_id: int) -> dict:
    """
    该接口用于获取群荣誉信息。
    :param group_id: 群号
    :return:
    """
    return requests.post(send_address + "/get_group_honor_info", data={"group_id": group_id}).json()


def is_blacklist_uin(user_id: int) -> dict:
    """
    获取好友/陌生人是否处于黑名单列表。
    :param user_id: qq号
    :return:
    """
    return requests.post(send_address + "/is_blacklist_uin", data={"user_id": user_id}).json()


def get_image(file: str):
    """
    该接口用于获取图片，只能获取已缓存的图片。
    :param file: 文件 MD5
    :return:
    """
    return requests.post(send_address + "/get_image", data={"file": file}).json()


def get_record(file: str, out_format: str) -> dict:
    """
    该接口用于获取语音。
    :param file: 文件 MD5
    :param out_format: 输出格式
    :return:
    """
    return requests.post(send_address + "/get_record", data={"file": file, "out_format": out_format}).json()


def set_group_name(group_id: int, group_name: str) -> dict:
    """
    该接口用于设置群名。
    :param group_id: 群号
    :param group_name: 新群名
    :return:
    """
    return requests.post(send_address + "/set_group_name", data={"group_id": group_id, "group_name": group_name}).json()


def set_group_admin(group_id: int, user_id: int, enable: bool = True) -> dict:
    """
    该接口用于设置群管理员。
    :param group_id: 群号
    :param user_id: qq号
    :param enable: 是否设置
    :return:
    """
    enable = "true" if enable else "false"
    return requests.post(send_address + "/set_group_admin",
                         data={"group_id": group_id,
                               "user_id": user_id,
                               "enable": enable}).json()


def set_group_special_title(group_id: int, user_id: int, special_title: str) -> dict:
    """
    该接口用于设置群组专属头衔。
    :param group_id: 群号
    :param user_id: qq号
    :param special_title: 头衔
    :return:
    """
    return requests.post(send_address + "/set_group_special_title",
                         data={"group_id": group_id, "user_id": user_id,
                               "special_title": special_title}).json()


def set_group_ban(group_id: int, user_id: int, duration: int = 0) -> dict:
    """
    该接口用于群单人禁言。
    :param group_id: 群号
    :param user_id: qq号
    :param duration: 禁言时间，单位秒，为0时解除禁言
    :return:
    """
    if duration < 60:  # 最短只能60秒，即1分钟
        duration = 60
    return requests.post(send_address + "/set_group_ban",
                         data={"group_id": group_id,
                               "user_id": user_id, "duration": duration}).json()


def set_group_whole_ban(group_id: int, enable: bool = True) -> dict:
    """
    该接口用于群全员禁言。
    :param group_id: 群号
    :param enable: qq号
    :return:
    """
    enable = "true" if enable else "false"
    return requests.post(send_address + "/set_group_whole_ban", data={"group_id": group_id, "enable": enable}).json()


def set_group_kick(group_id: int, user_id: int, reject_add_request: bool = False) -> dict:
    """
    该接口用于群组踢人。
    :param group_id: 群号
    :param user_id: qq号
    :param reject_add_request: 是否拒绝再次加群
    :return:
    """
    reject_add_request = "true" if reject_add_request else "false"
    return requests.post(send_address + "/set_group_kick", data={"group_id": group_id, "user_id": user_id,
                                                                 "reject_add_request": reject_add_request}).json()


def set_group_leave(group_id: int) -> dict:
    """
    该接口用于退出群组。
    :param group_id: 群号
    :return:
    """
    return requests.post(send_address + "/set_group_leave", data={"group_id": group_id}).json()


def group_touch(group_id: int, user_id: int) -> dict:
    """
    该接口用于群戳一戳。
    :param group_id: 群号
    :param user_id: QQ号
    :return:
    """
    return requests.post(send_address + "/group_touch", data={"group_id": group_id, "user_id": user_id}).json()


def upload_private_file(user_id: int, file: str, name: str) -> dict:
    """
    该接口用于上传私聊文件。
    :param user_id: 目标
    :param file: 本地文件路径
    :param name: 储存名称
    :return:
    """
    return requests.post(send_address + "/upload_private_file",
                         data={"user_id": user_id, "file": file, "name": name}).json()


def upload_group_file(group_id: int, file: str, name: str) -> dict:
    """
    用于上传群文件
    :param group_id: 群号
    :param file: 本地文件路径
    :param name: 储存名称
    :return:
    """
    return requests.post(send_address + "/upload_group_file",
                         data={"group_id": group_id, "file": file, "name": name}).json()


def delete_group_file(group_id: int, file_id: int, busid: int) -> dict:
    """
    该接口用于删除群文件。
    :param group_id: 群号
    :param file_id: 文件ID 参考 File 对象
    :param busid: 文件类型 参考 File 对象
    :return:
    """
    return requests.post(send_address + "/delete_group_file",
                         data={"group_id": group_id, "file_id": file_id, "busid": busid}).json()


def create_group_file_folder(msg_id: int) -> dict:
    """
    创建群文件文件夹，仅能在根目录创建文件夹
    :param msg_id: 文件消息id
    :return:
    """
    return requests.post(send_address + "/create_group_file_folder", data={"msg_id": msg_id}).json()


def delete_group_folder(group_id: int, folder_id: int) -> dict:
    """
    删除群文件文件夹
    :param group_id: 群号
    :param folder_id: 文件夹ID 参考 Folder 对象
    :return:
    """
    return requests.post(send_address + "/delete_group_folder",
                         data={"group_id": group_id, "folder_id": folder_id}).json()


def get_group_file_system_info(group_id: int) -> dict:
    """
    获取群文件系统信息
    :param group_id: 群号
    :return:
    """
    return requests.post(send_address + "/get_group_file_system_info", data={"group_id": group_id}).json()


def get_group_root_files(group_id: int) -> dict:
    """
    获取群根目录文件列表
    :param group_id: 群号
    :return:
    """
    return requests.post(send_address + "/get_group_root_files", data={"group_id": group_id}).json()


def get_group_files_by_folder(group_id: int, folder_id: int) -> dict:
    """
    获取群子目录文件列表
    :param group_id: 群号
    :param folder_id: 文件夹ID 参考 Folder 对象
    :return:
    """
    return requests.post(send_address + "/get_group_files_by_folder",
                         data={"group_id": group_id, "folder_id": folder_id}).json()


def get_group_file_url(group_id: int, file_id: int, busid: int) -> dict:
    """
    获取群文件资源链接
    :param group_id: 群号
    :param file_id: 文件ID 参考 File 对象
    :param busid: 文件类型 参考 File 对象
    :return:
    """
    return requests.post(send_address + "/get_group_file_url",
                         data={"group_id": group_id, "file_id": file_id, "busid": busid}).json()


def download_file(url: str, thread_cnt: int = 10, headers: list = None) -> dict:
    """
    下载文件到缓存目录
    :param url: 下载地址
    :param thread_cnt: 下载的线程数量，默认10
    :param headers: 请求头
    :return:
    """
    _data = {"url": url, "thread_cnt": thread_cnt}
    if headers is not None:
        _data.update({"headers": headers})
    return requests.get(send_address + "/download_file", params=_data).json()


def get_device_battery() -> dict:
    """
    获取手机电池信息
    :return:
    """
    return requests.get(send_address + "/get_device_battery").json()


def get_start_time() -> dict:
    """
    获取Shamerock启动时间
    :return:
    """
    return requests.get(send_address + "/get_start_time").json()


def get_log(recent: bool = False, start: int = None) -> str:
    """
    获取Shamrock日志
    :param recent: 是否只显示最近的日志
    :param start: 开始的行
    :return: 日志
    """
    _data = {"recent": "true" if recent else "false"}
    if start is not None:
        _data.update({"start": start})
    return requests.get(send_address + "/log", params=_data).text


def stop_shut() -> dict:
    """
    关闭Shamrock
    :return:
    """
    return requests.post(send_address + "/shut").json()
